ADOQuery prebirani parameters z DataSource.
Otázka od: David Michal
13. 11. 2002 16:31
Zdravim,
Delphi6, ADO, MSSQL2000.
V programu mam toto:
With Q_Temp1 do //componenta TADOQuery
begin
Close;
Sql.Clear;
Sql.Add('Select ID_Company From Company Where Name = ''Name'' ');
Open;
end;
With Q_Temp2 do //componenta TAdoQuery
begin
Close;
Sql.Clear;
Sql.Add('Select Person From People Where ID_Company = :ID_Company');
DataSource := DS_Temp1; //DS_Temp1 je komponenta TDataSource s datasetem
Q_Temp1
Open;
end;
//vim ze by to slo resit jednim SQL prikazem, tato ukazka je zde pouze pro
predstaveni meho problemu
pak s tim nejak pracuji a nakonec davam:
Q_Temp2.DataSource := nil;
Q_Temp2.Close;
Q_Temp1.Close;
A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.
Diky,
David Michal
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.417 / Virus Database: 233 - Release Date: 08/11/2002
Odpovedá: tuffi@email.cz
13. 11. 2002 17:20
Nestacilo by dat Unprepare / Prepare? Pripadne ho(parametr) tam dohodit ruco? :-
)
--- Původní zpráva ---
Od: "David Michal" <david.michal@www-bv.com>
Datum: 13.11.2002 15:59:21
Zdravim,
Delphi6, ADO, MSSQL2000.
A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.
Diky,
David Michal
---
______________________________________________________________________________
Email.cz -----> Vaše emailová schránka zdarma.
http://www.Email.cz <------------Pošta zdarma!
Odpovedá: David Michal
14. 11. 2002 11:29
Zdravim,
To by nestacilo. TADOQuery nema metodu unprepare. Ale i kdyz bych pred
zmenou sql.text nastavil Prepared := False, tak to nicemu nepomuze. A rucne
ho zadat nemohu, jelikoz to takto pouzivam pro vystup do sestavy se
Subdetails.
David
-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz]On
Behalf Of tuffi@email.cz
Sent: 13 November 2002 17:12
To: delphi-l@clexpert.cz
Subject: Re: ADOQuery prebirani parameters z DataSource.
Nestacilo by dat Unprepare / Prepare? Pripadne ho(parametr) tam dohodit
ruco?
--- Původní zpráva ---
Od: "David Michal" <david.michal@www-bv.com>
Datum: 13.11.2002 15:59:21
Zdravim,
Delphi6, ADO, MSSQL2000.
A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.
Diky,
David Michal
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.419 / Virus Database: 235 - Release Date: 13/11/2002
Odpovedá: Lstiburek Pavel
14. 11. 2002 14:24
Ahoj,
sam prikazy s ":" notaci parametru nepozivam, davam prednost
ulozenym proceduram (kdyz uz v serveru jsou), ale
nedalo mi to. Toto je postup, ktery urcite vede k cili
(neco jde asi vyhodit -> nutno vyzkouset):
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
Button1: TButton;
ADOQuery2: TADOQuery;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery2.Close;
ADOQuery1.Close;
//zmena masteru i detailu
ADOQuery1.SQL.Text := 'SELECT * FROM Ucet';
ADOQuery2.SQL.Text :=
'SELECT * FROM Smlouva WHERE CisloSmlouvy
=:CisloSmlouvy';
//natazeni parametru
ADOQuery2.Parameters.Clear;
//nastaveni udaju o prametru (vim, ze jen jeden)
ADOQuery2.Parameters.ParseSQL(ADOQuery2.SQL.Text, True);
ADOQuery2.Parameters[0].DataType := ftString;
ADOQuery2.Parameters[0].Attributes := [];
ADOQuery2.Parameters[0].Direction := pdInput;
ADOQuery2.Parameters[0].NumericScale := 255;
ADOQuery2.Parameters[0].Precision := 255;
ADOQuery2.Parameters[0].Size := 10;
ADOQuery2.Parameters[0].Value := NULL;
//ShowMessage( ADOQuery2.Parameters[0].Name);
ADOQuery1.Open;
ADOQuery2.Open;
end;
Pavel
---
A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.
Odpovedá: David Michal
14. 11. 2002 16:37
Zdravim,
Tak ani takto to neprojde. Takto to funguje pokud mam stale stejny Sql.Text
v obou Queries. Jakmile tento text zmenim a budu chtit jine parametry, tak
mi program hodi chybovou hlasku s tim, ze nemuze najit parametr. V tomto
pripade napise ze nemuze najit CisloSmlouvy. Pokud Sql.Text nememin tak vse
funguje tak jak ma.
David
Ahoj,
sam prikazy s ":" notaci parametru nepozivam, davam prednost
ulozenym proceduram (kdyz uz v serveru jsou), ale
nedalo mi to. Toto je postup, ktery urcite vede k cili
(neco jde asi vyhodit -> nutno vyzkouset):
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery2.Close;
ADOQuery1.Close;
//zmena masteru i detailu
ADOQuery1.SQL.Text := 'SELECT * FROM Ucet';
ADOQuery2.SQL.Text :=
'SELECT * FROM Smlouva WHERE CisloSmlouvy
=:CisloSmlouvy';
//natazeni parametru
ADOQuery2.Parameters.Clear;
//nastaveni udaju o prametru (vim, ze jen jeden)
ADOQuery2.Parameters.ParseSQL(ADOQuery2.SQL.Text, True);
ADOQuery2.Parameters[0].DataType := ftString;
ADOQuery2.Parameters[0].Attributes := [];
ADOQuery2.Parameters[0].Direction := pdInput;
ADOQuery2.Parameters[0].NumericScale := 255;
ADOQuery2.Parameters[0].Precision := 255;
ADOQuery2.Parameters[0].Size := 10;
ADOQuery2.Parameters[0].Value := NULL;
//ShowMessage( ADOQuery2.Parameters[0].Name);
ADOQuery1.Open;
ADOQuery2.Open;
end;
Pavel
---
A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.419 / Virus Database: 235 - Release Date: 13/11/2002
Odpovedá: Lstiburek Pavel
14. 11. 2002 18:59
Co to je stale stejny SQL.Text ? V prikladu jsem zmenil oba sql prikazy
a maji ruzny i parametr :"bleble". To ze nemuze najit CisloSmlouvy je OK,
to je prave jmeno toho parametru !
Je to nutno napsat tak, aby ADOQuery1 melo v result setu sloupec se stejnym
nazvem (nazvy) jako je (jsou) parametr(y) v ADOQuery2 !
tj. to co je za "=:". Jinak master detail nepracuje !
// vymazani stavajiciho seznamu parametru
ADOQuery2.Parameters.Clear;
// nalezeni novych a vytvoreni jejich seznamu
ADOQuery2.Parameters.ParseSQL(ADOQuery2.SQL.Text, True);
//nastaveni vlastnosti parametru --> nutno upravit dle skutecnosti !
// nejjednoduseji vytazenim z ADOQuery1 -> musi obsahovat
// sloupce se s nazvem shodnym s nazvem parametru
// v prikladu je to "natvrdo" je to priklad
//
// nejlepe v cyklu pres vsechny parametry
ADOQuery2.Parameters[0].DataType :=
ADOQuery1.FieldByName(ADOQuery2.Parameters[0].Name).DataType;
ADOQuery2.Parameters[0].Attributes := [];
ADOQuery2.Parameters[0].Direction := pdInput;
ADOQuery2.Parameters[0].NumericScale := 255;
ADOQuery2.Parameters[0].Precision := 255;
ADOQuery2.Parameters[0].Size :=
ADOQuery1.FieldByName(ADOQuery2.Parameters[0].Name).Size;
ADOQuery2.Parameters[0].Value := NULL;
ParseSQL(ADOQuery2.SQL.Text, True) bylo v poradku,
ale je nutno doplnit jeste properties jednotlivych parametru.
Pavel
PS: Jestli chces poslu ti ten priklad cely na soukromy mail (i daty).
Odpovedá: Erik Salaj
14. 11. 2002 19:53
> A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do
doby
> dokud nezmenim SQL.Text u obou komponent.
> Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
> chybovou hlasku, ze nenalezl parametr ID_Company.
> Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
> Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat
seznam
> parameters, ale nevim kde a jak presne to udelat.
zda sa, ze je to chyba vo VCL, detail dataset musi byt otvoreny pred master
datasetom, aby to fungovalo, ale potom znova zatvoreny a otvoreny aby
zohladnil hodnotu v master query. Takze tu je workaground, ktory som nasiel:
ADOQuery1.SQL.Text :=
'SELECT ID_Company FROM Company WHERE Name =
''WINSOFT''';
ADOQuery2.SQL.Text :=
'SELECT ForeName FROM People WHERE ID_Company =
:ID_Company';
ADOQuery2.Open;
ADOQuery1.Open;
// reopen detail query
ADOQuery2.Close;
ADOQuery2.Open;
Erik
Odpovedá: Erik Salaj
14. 11. 2002 23:22
> A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do
doby
> dokud nezmenim SQL.Text u obou komponent.
> Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
> chybovou hlasku, ze nenalezl parametr ID_Company.
> Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
> Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat
seznam
> parameters, ale nevim kde a jak presne to udelat.
este jedna poznamka: v Adonise sa tento problem nevyskytuje, funguje to tam
korektne,
treba len nastavit typ parametra na ptInput:
ADOQuery1.SQL.Text :=
'SELECT ID_Company FROM Company WHERE Name =
''WINSOFT''';
ADOQuery1.Open;
ADOQuery2.SQL.Text :=
'SELECT ForeName FROM People WHERE ID_Company =
:ID_Company';
ADOQuery2.Params[0].ParamType := ptInput;
ADOQuery2.Open;
Erik